package com.youhome.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by chen365 on 2018/07/16.
 */
public class GeoUtils {

    private static final double EARTH_RADIUS = 6378137.0;
    //经度范围：-180~180（只支持保留小数点后15位）
    public static String lonReg = "^(\\-|\\+)?(((\\d|[1-9]\\d|1[0-7]\\d|0{1,3})\\.\\d{0,15})|(\\d|[1-9]\\d|1[0-7]\\d|0{1,3})|180\\.0{0,15}|180)$";
    //纬度范围：-90~90（只支持保留小数点后15位）
    public static String latReg = "^(\\-|\\+)?([0-8]?\\d{1}\\.\\d{0,15}|90\\.0{0,15}|[0-8]?\\d{1}|90)$";

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double a = radLat1 - radLat2;
        double b = rad(lng1) - rad(lng2);
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        s = Math.round(s * 10000) / 10000;
        return s;
    }


    /**
     * 判断是否与给定字符串样式匹配
     *
     * @param str     字符串
     * @param pattern 正则表达式样式
     * @return 是否匹配 是true,否false
     */
    public static boolean isMatch(String str, String pattern) {
        Pattern pattern_hand = Pattern.compile(pattern);
        Matcher matcher_hand = pattern_hand.matcher(str);
        return matcher_hand.matches();
    }

    /**
     * 验证经纬度
     *
     * @param lon 经度
     * @param lat 纬度
     * @return 是否匹配 是true,否false
     */
    public static boolean isCoordinate(Double lon, Double lat) {
        return isCoordinate(lon.toString(), lat.toString());
    }

    /**
     * 验证经纬度
     *
     * @param lon 经度
     * @param lat 纬度
     * @return 是否匹配 是true,否false
     */
    public static boolean isCoordinate(String lon, String lat) {
        if (!isMatch(lon, lonReg)) {
            return false;
        }
        if (!isMatch(lat, latReg)) {
            return false;
        }
        return true;
    }




    /*
    public static void main(String[] args) {
        Double lat = 37.39773;
        Double lng = -122.01468;
        Double lat2 = 37.389214;
        Double lng2 = -122.01574;
        //double distance = getDistance(-94.1842, 36.192753, -94.1842, 36.192753);
        double distance = getDistance(lat, lng, lat2, lng2);
        System.err.println(distance);
    }
    */

}
